package com.cskaoyan.javse.oop2._2polymorphic._1basic._3advantage;

/**
 * 引用数据类型的向下转型,也就是强转
 * 前提: 只能把父类引用转换成子类引用,如果没有父子关系,转换不了,会编译报错
 * 强转的语法:
 *      子类类名 对象名 = (子类类名) 父类引用;
 * 引用数据类型的强转很危险,强转失败就会抛出异常:ClassCastException(类型转换异常)
 *
 * 成功的前提: 父类引用所指向的对象的真实类型，必须是要强转成的子类引用类型的对象或者子类对象
 *
 * 引用数据类型的向下转型，很容易失败，失败后果也很严重，所以Java中给出了检测手段，来判断是否能够进行强转。使用instanceof关键字
 * 语法：
 *      引用 instanceof 类名
 * 作用：
 *      上述语法返回一个boolean类型值：
 * 1. true表示该引用指向的对象，是后面类名的一个对象或者子类对象。
 * 2.  反之，false则表示不是。
 * 3.  当引用指向null时，使用该语法，结果会直接返回false。
 *
 * @since 17:32
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        /*Father f = new Grandson();
        // 这是物归原主，很好理解
        Grandson gs = (Grandson) f;
        Son s = (Son) f;*/

        // Father f = new Son();
        // Son s = (Son) f;
        // Grandson f1 = (Grandson) f;

        Object o = new Grandson();
        Grandson o1 = (Grandson) o;
        Son o2 = (Son) o;
        Father o3 = (Father) o;

    }
}

class Father {
}

class Son extends Father {
}

class Grandson extends Son {
}
